#include "flash.h"

// 解锁Flash, 此函数只需执行一次
void Flash_Unlock(void) { HAL_FLASH_Unlock(); }

// 擦除flash, 即将相应的页所有位置1
void Flash_Erase(uint32_t addr) {
  FLASH_EraseInitTypeDef hflashErase;
  // 标明Flash执行页面只做擦除操作
  hflashErase.TypeErase = FLASH_TYPEERASE_PAGES;
  // 声明要擦除的地址
  hflashErase.PageAddress = addr;
  // 说明要擦除的页数，此参数必须是Min_Data = 1和
  // Max_Data=(最大页数-初始页的值)之间的值
  hflashErase.NbPages = 1;
  // 设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址
  uint32_t PageError = 0;
  // 调用擦除函数擦除
  HAL_FLASHEx_Erase(&hflashErase, &PageError);
}

// 此函数只能把值为1的位置为0, 而不能把值为0的位置为1
// 所以应视情况确定是否要在写入数据前先擦除
void Flash_Write(uint32_t addr, uint16_t *data, uint16_t len) {
  // 对Flash进行烧写，FLASH_TYPEPROGRAM_HALFWORD
  // 声明操作的Flash地址的16位的，此外还有32位跟64位的操作，自行翻查HAL库的定义即可
  // 之所以选择16位是因为32位和64位的操作本质上都是通过16位实现的
  while (len > 0) {
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr, *data);
    // 指针的单位是字节, 这里是16位即2字节
    addr += 2;
    data++;
    len--;
  }
}
